package com.itheima.reggie.controller;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.reggie.common.R;
import com.itheima.reggie.dto.DishDto;
import com.itheima.reggie.entity.Dish;
import com.itheima.reggie.service.DishService;
import com.sun.org.apache.xpath.internal.operations.Bool;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 新增菜品
 *      展示分类下拉列表
 *          ·前端
 *              前端点击新增按钮，发送请求
 *              http://localhost/category/list?type=1
 *              根据返回值将信息展示在下拉列表
 *          ·后端
 *              在CategoryController创建方法，接收type
 *              创建条件构造器，将type作为条件传入
 *              调用查询方法，传入lqw，查询对应的数据集合
 *              返回查询结果
 *
 *      提交表单
 *          ·前端
 *              用户输入完数据，点击提交按钮，发送请求
 *              根据返回结果，判断返回或者清空
 *          ·后端
 *              前端传递的数据dish包括了flavor集合，封装DishDto进行存储数据
 *              在DishService创建saveWithFlavor方法，存储菜品数据和口味数据
 *                  1.调用DishService的save方法存储dish
 *                  2.从dishDto中取出id
 *                  3.从dishDto中取出口味集合
 *                  4.对口味集合进行遍历，赋值dishId
 *                  5.调用flavor的存储方法存储集合
 *              返回新增成功
 *
 *  分页展示菜品
 *      ·前端
 *          用户点击菜品管理，发送请求，携带page，pageSize，name到后端
 *          展示时需要展示基本信息和分类名称，所以需要dto数据返回
 *      ·后端
 *          接收前端发送的请求参数，返回值为page<DishDto>
 *          DishDto没有特定的查询方法，调用自定义查询方法
 *              在DishService创建查询方法
 *                  1.创建分页构造器，传入page，pageSize
 *                  2.创建条件构造器
 *                  3.根据name，sort，updateTime进行查询
 *                  因为查询出来的数据没有categoryName属性
 *                  4.创建新的page，参数为DishDto，将dish的基本信息copy到dto，除了具体的菜品数据
 *                  5.对菜品数据进行重新赋值
 *                      从dish中读取菜品信息，集合数据
 *                      对数据进行遍历，创建dto对象，将item对象的值copy到dto对象
 *                      获取到categoryId，通过获取到categoryService的id查询方法查询到获取到categoryName
 *                      将获取到categoryName的值赋值给dto对象，将对象进行返回
 *                      将数据重新转为list集合，以dishDto作为参数
 *                  6.返回pageDishDto对象
 *          返回查询成功，将pageDishDto传递给前端
 *
 *  修改菜品
 *      ·数据回显
 *          前端
 *              点击修改按钮，发送请求，携带当前行id
 *              根据返回信息判断，进行数据回显
 *          后端
 *              接收请求携带的id，返回值为DishDto对象
 *              调用查询方法，获取到DishDto对象，进行返回
 *                  创建查询方法
 *                      1.根据id查询到dish的信息
 *                      2.根据id查询到flavor信息
 *                          创建条件构造器
 *                          将dishId作为条件传入，查询到对应的口味信息
 *                      3.创建dto对象，将dish信息和flavor信息存储进去
 *                      4.将dto对象进行返回
 *
 *      ·修改数据
 *          前端
 *              点击提交按钮，删除数据存储的 修改时间，将页面数据发送到后端
 *              根据返回结果跳转页面
 *          后端
 *              接收页面传递的信息，调用自定义修改方法
 *                  创建修改方法，参数为dishDto对象
 *                      将dish的值根据dto对象进行修改
 *                      根据dishId删除flavor的信息
 *                      将dto对象的flavor信息存储到flavor中
 *                          对数据进行操作，添加dishId到数据
 *              返回修改成功
 *
 *  删除/批量删除数据
 *      ·前端
 *          页面点击删除按钮，发送只有一个数据的集合
 *          页面选中多个数据，点击批量删除按钮，发送数据的集合
 *          根据返回值返回查询是否成功
 *      ·后端
 *          页面发送的是普通数据，使用@RequestParam接收集合数据
 *          开启事务，逻辑删除
 *          调用删除方法，同时删除菜品和口味信息
 *              创建删除方法，参数为id集合
 *              调用dish的批量删除方法，根据id进行删除
 *              创建条件构造器，将id作为条件，使用in()和dish_id进行比对
 *              调用批量删除方法，删除查询到的数据
 *
 *  状态修改
 *      ·前端
 *          页面点击停售或者批量停售，发送status=0和选中行的id
 *          页面点击启售或者批量启售，发送status=1和选中行的id
 *          根据返回值进行判断是否成功
 *      ·后端
 *          页面发送ids用@RequestParam接收，发送的status使用@PathVariable接收
 *          调用修改方法，进行数据修改
 *              创建修改方法，参数为ids，status
 *              创建修改构造器，添加ids作为条件，set方式修改状态
 *                  LambdaUpdateWrapper
 *                  luw.in(ids)
 *                  luw.set(status)
 *              调用修改方法，传入luw
 */

@RestController
@RequestMapping("/dish")
public class DishController {

    @Autowired
    private DishService service;

    /**
     * 新增菜品
     * @param dishDto
     * @return
     */
    @PostMapping
    public R<String> save(@RequestBody DishDto dishDto){

        //调用保存方法
        service.saveWithFlavor(dishDto);

        //返回结果
        return R.success("添加成功");
    }

    /**
     * 分页查询页面信息
     * @param page
     * @param pageSize
     * @param name
     * @return
     */
    @GetMapping("/page")
    public R<Page> getAll(int page,int pageSize,String name){

        //调用查询方法，查询分页数据
        Page<DishDto> dishDtoPage = service.getAll(page,pageSize,name);

        //将结果信息返回
        return R.success(dishDtoPage);
    }

    /**
     * 根据id查询dto对象
     * @param id
     * @return
     */
    @GetMapping("/{id}")
    public R<DishDto> getById(@PathVariable Long id){

        //调用id查询方法，获取到对应数据
        DishDto dishDto = service.getDishDtoById(id);

        //返回查询到的信息
        return R.success(dishDto);
    }

    /**
     * 修改页面数据
     * @param dishDto
     * @return
     */
    @PutMapping
    public R<String> update(@RequestBody DishDto dishDto){

        //调用修改方法，将dto数据进行修改
        service.updateByDishDto(dishDto);

        //返回修改成功
        return R.success("修改信息成功");
    }

    /**
     * 批量删除数据
     * @param ids
     * @return
     */
    @DeleteMapping
    public R<String> delete(@RequestParam List<Long> ids){

        //调用删除方法
        Boolean flag = service.removeDishAndDishFlavorByIds(ids);

        //判断是否删除成功
        if (flag){
            return R.success("删除成功");
        }

        return R.error("删除失败");
    }

    @PostMapping("/status/{status}")
    public R<String> updateStatus(@PathVariable int status,@RequestParam List<Long> ids){

        //调用修改状态的方法
        service.updateStatus(status,ids);

        //返回修改结果
        return R.success("修改成功");
    }
}
